﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Collections;
using OpenGLES;

class CacheDXF : IEntidad
{

    #region Miembros de IEntidad

    protected Linea[] arrLineas;
    protected const int MAX_LINEAS = 250;
    protected const int MAX_TEXTOS = 20;
    protected Colores[] Colores;
    protected Capa[] Capas;
    public float AlturaZ = 0.003f;

    public unsafe CacheDXF(Escenario _objEscenario, float _pAlturaMax, TIPO_ENTIDAD enmEntidad)
    {
        arrLineas = new Linea[MAX_LINEAS*2];
        for (int i = 0; i < MAX_LINEAS*2; i++)
        {
            arrLineas[i] = new Linea();
        }
        //TODO: MAX_TEXTOS
        this.ENTIDAD = enmEntidad;
        this.Escena = _objEscenario;
        this.AlturaMax = _pAlturaMax;
        this.Localizacion = new Coordenada();
        this.Visible = true;
    }


	//propiedades
    private Escenario _Escena;
    public Escenario Escena
    {
        get { return _Escena; }
        set { _Escena = value; }
    }

    private TIPO_ENTIDAD _ENTIDAD;
    public TIPO_ENTIDAD ENTIDAD
    {
        get { return _ENTIDAD; }
        set { _ENTIDAD = value; }
    }


    private float _AlturaMax;
    public float AlturaMax
    {
        get { return _AlturaMax; }
        set { _AlturaMax = value; }
    }

    private int _indiceActual;
    public int IndiceActual
    {
        get { return _indiceActual; }
        set { _indiceActual = value; }
    }

	private Colores _coloreadoBorde;
	public Colores ColoreadoBorde {
		get { return _coloreadoBorde; }
		set { _coloreadoBorde = value; }
	}

	private Estilo.Borde _tipoBorde;
	public Estilo.Borde TipoBorde {
		get { return this._tipoBorde; }
		set { this._tipoBorde = value; }
	}

	private Estilo.Forma _tipoForma;
	public Estilo.Forma TipoForma {
		get { return this._tipoForma; }
		set { this._tipoForma = value; }
	}

	private string _id;
	public string ID {
		get { return _id; }
		set { _id = value; }
	}

	private bool _visible;
	public bool Visible {
		get { return _visible; }
        set { _visible = value; }
	}

	private Coordenada _localizacion;
	public Coordenada Localizacion {
		get { return _localizacion; }
		set { 
            _localizacion = value;
        }
	}


	private Colores _coloreado;
	public Colores Coloreado {
		get { return _coloreado; }
		set { _coloreado = value; }
	}

	public Capa CapaCanvas {
		get { return null; }
		set {  }
	}

    #endregion

    public unsafe void _pintar()
	{
		//Tamano de la linea y los puntos
        if (this.Visible && Escena.Localizacion.Z <= this.AlturaMax)
        {
            if (this.Localizacion.X != Escena.Localizacion.X || this.Localizacion.Y != Escena.Localizacion.Y ||
                this.Localizacion.Z != Escena.Localizacion.Z)
            {
                this.ReconstruirCache();
                this.Localizacion.X = Escena.Localizacion.X;
                this.Localizacion.Y = Escena.Localizacion.Y;
                this.Localizacion.Z = Escena.Localizacion.Z;
            }
            for (int i = 0; i < IndiceActual; i++)
            {
                arrLineas[i]._pintar();
            }
        }
	}

    private unsafe void ReconstruirCache()
    {
        IndiceActual = -1;
        Coordenada objXY1 = Escena.coordenadasXY(1, 1);
        Coordenada objXY2 = Escena.coordenadasXY(Escena.Largo + 1f, Escena.Alto + 1f);
        float fltAlturaExedeX = (objXY2.X - objXY1.X) / 4;
        float fltAlturaExedeY = (objXY1.Y - objXY2.Y) / 4;
        float fltFacTorDivision = Escenario.FactorDivision;
        objXY1.X *= fltFacTorDivision;
        objXY1.Y *= fltFacTorDivision;
        objXY2.X *= fltFacTorDivision;
        objXY2.Y *= fltFacTorDivision;

        objXY1.X -= (this.Escena.Alto / 9);
        objXY1.Y += (this.Escena.Alto / 9);
        objXY2.X += (this.Escena.Alto / 9);
        objXY2.Y -= (this.Escena.Alto / 9);
        //LINEAS 1
        string strConsulta = STR_CONSULTA.Replace("{X1}", objXY2.X.ToString().Replace(",", "."));
        strConsulta = strConsulta.Replace("{X2}", objXY1.X.ToString().Replace(",", "."));
        strConsulta = strConsulta.Replace("{Y1}", objXY2.Y.ToString().Replace(",", "."));
        strConsulta = strConsulta.Replace("{Y2}", objXY1.Y.ToString().Replace(",", "."));
        strConsulta = strConsulta.Replace("{MAX_LINEAS}", (MAX_LINEAS).ToString());
        DataTable objTabla = Conexion.ObtenerTabla(strConsulta);
        float x, y, x2, y2, r, g, b;
        x = 0.0f;
        y = 0.0f;
        Colores objColorLin = new Colores(125, 125, 125);
        Hashtable objDatos = new Hashtable(100);
        foreach (DataRow objRegistro in objTabla.Rows)
        {
            IndiceActual++;
            if (IndiceActual == MAX_LINEAS)
            {
                break;
            }

            x = float.Parse(objRegistro["DLI_X1"].ToString()) / fltFacTorDivision;
            y = float.Parse(objRegistro["DLI_Y1"].ToString()) / fltFacTorDivision;
            x2 = float.Parse(objRegistro["DLI_X2"].ToString()) / fltFacTorDivision;
            y2 = float.Parse(objRegistro["DLI_Y2"].ToString()) / fltFacTorDivision;
            r = float.Parse(objRegistro["DLI_R"].ToString());
            g = float.Parse(objRegistro["DLI_G"].ToString());
            b = float.Parse(objRegistro["DLI_B"].ToString());
            arrLineas[IndiceActual].Coloreado = objColorLin;
            arrLineas[IndiceActual].Localizacion = new Coordenada(x, y, AlturaZ);
            arrLineas[IndiceActual].Localizacion2 = new Coordenada(x2, y2, AlturaZ);
            arrLineas[IndiceActual].ID = "DL" + objRegistro["DLI_ID"].ToString();
            objDatos.Add(objRegistro["DLI_ID"].ToString(), objRegistro["DLI_ID"].ToString());
        }
        objTabla.Dispose();
        objTabla = null;
    }

}